package com.loser.core;

import com.loser.bizAnnotation.BizDoubleCache;
import com.loser.bizAnnotation.BizLocalCache;
import com.loser.bizAnnotation.BizRedisCache;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;

/**
 * 服务切面
 *
 * @author alan
 * @date 2022/5/23 13:20
 */
@Aspect
public class CacheAspect {

    private final CacheManger cacheManger;

    public CacheAspect(CacheManger cacheManger) {
        this.cacheManger = cacheManger;
    }

    // 03 ========================= redis缓存 start ====================================================

    /**
     * 标记这方法优先使用redis缓存
     */
    @Pointcut("@annotation(com.loser.bizAnnotation.BizRedisCache)")
    private void markUseRedisCache() {
    }

    /**
     * 缓存切面
     *
     * @param bizRedisCache 缓存类
     */
    @Around(value = "markUseRedisCache() && @annotation(bizRedisCache)")
    public Object redisCacheHandler(ProceedingJoinPoint pjd, BizRedisCache bizRedisCache) throws Throwable {
        return cacheManger.redisCacheHandler(pjd, bizRedisCache);
    }

    // 03 ========================= redis缓存 end ====================================================

    // 04 ========================= 本地缓存 start ====================================================

    /**
     * 标记这方法优先使用本地缓存
     */
    @Pointcut("@annotation(com.loser.bizAnnotation.BizLocalCache)")
    private void markUseLocalCache() {
    }

    /**
     * 缓存切面
     *
     * @param bizLocalCache 缓存类
     */
    @Around(value = "markUseLocalCache() && @annotation(bizLocalCache)")
    public Object localCacheHandler(ProceedingJoinPoint pjd, BizLocalCache bizLocalCache) throws Throwable {
        return cacheManger.localCacheHandler(pjd, bizLocalCache);
    }

    // 04 ========================= 本地缓存 end ====================================================

    // 05 ========================= 双层缓存 start ====================================================

    /**
     * 标记这方法优先使用本地缓存
     */
    @Pointcut("@annotation(com.loser.bizAnnotation.BizDoubleCache)")
    private void markUseDoubleCache() {
    }

    /**
     * 缓存切面
     *
     * @param bizDoubleCache 缓存类
     */
    @Around(value = "markUseDoubleCache() && @annotation(bizDoubleCache)")
    public Object doubleCacheHandler(ProceedingJoinPoint pjd, BizDoubleCache bizDoubleCache) throws Throwable {
        return cacheManger.doubleCacheHandler(pjd, bizDoubleCache);
    }

    // 05 ========================= 双层缓存 start ====================================================

}
